# -*- coding: utf-8 -*-
class LoginController < ApplicationController
  layout  'loginpage' , :except=>[:login, :air_login]

  include ApplicationHelper

  #
  #ログイン画面を表示，及びログイン処理を行う
  #
  #リクエストメソッドがGETの場合はログイン画面を表示する．
  #POSTの場合には，フォームからポストされたuser_login_idとuser_passwordを元にログイン処理を行う
  #
  #ログインに成功した場合は，プロジェクトのダッシュボードへリダイレクトする．
  #失敗した場合には再度ログイン画面を表示して終了
  #
  #_user_login_id_ :: ログインID
  #_user_password_ :: パスワード
  #
  def login
    case request.method
      when :post
        if user = MstUser.authenticate(params['user_login_id'], params['user_password'])
          reset_session
          #ログイン日時更新
          user.update_attribute(:last_login_on, Time.now)
          session['user'] = user
          flash['notice'] = "Login successful"
          redirect_to(:controller => "project", :action => "index")
        else
          @login   = params['user_login_id']
          @message = "Login unsuccessful"
        end
    end
  end

  #
  #サインアップ画面を表示，及びサインアップ処理を行う
  #
  #リクエストメソッドがGETの場合はサインアップ画面を表示する．
  #
  #POSTの場合には，フォームからポストされた各パラメータを元にユーザを新規生成する．
  #新規作成に成功した場合には，サインアップ完了メールを，入力されたメールアドレス宛に送信する．
  #その際のメール送信設定は"config/environment.rb"にて設定する．
  #
  def signup
    case request.method
      when :post
        @user = MstUser.new(params['user'])
        @user.login_id = @user.email

        # パスワード自動生成
        password = self.create_password
        @user.srcpassword = password
        @user.password    = MstUser.sha1(password)
        @user.password_confirmation = MstUser.sha1(password)

        if @user.save
          session['user'] = MstUser.authenticate(@user.login_id, password)
          # プロジェクトユーザーデータに該当emailが存在すれば、ユーザーIDを更新
          DatProjectuser.update_all([" user_id = ? ", @user.id ], [ "email = ? ", @user.email ])

          flash['notice']  = "Signup successful"

          # サインアップ完了メールを送信する
          mail_opt = {
            :subject     => app_localized_message( :label, :signup_mail_subject ),
            :url_profile => url_for(:controller=>:user, :action=>:edit, :id=>@user.id ),
            :password    => password
          }
          AppMailer.deliver_mail_signup_confirm( @user, mail_opt)

          redirect_to(:controller => 'project', :action => 'index')
        else
          _errors = ''
          @user.errors.each do |attr, msg|
            attr = (attr == 'login_id') ? :user_login_id : attr;
            label = 'label_' + attr.to_s
            key   = 'error_' + msg.to_s
            logger.debug label
            attribute = @app_messages_hash[label]
            message   = @app_messages_hash[key]
            _errors << attribute.msg_base + message.msg_base + '<br />' if (attribute and message)
          end
          @errors = _errors
        end
      when :get
        @user = MstUser.new
    end
  end

  def sendpassword
    email = params[:user_forgetpassword]
    opt   = {
      :conditions => ["login_id = ? AND email = ?", email, email]
    }
    user = MstUser.find(:first, opt)
    if user
      opt_mail = {
        :subject     => app_localized_message(:label, :signup_mail_subject),
        :url_profile => url_for(:controller=>:user, :action=>:edit, :id=>user.id),
      }
      AppMailer.deliver_mail_signup_confirm(user, opt_mail)
      redirect_to({:controller=>'login', :action=>'sentpassword'})
    else
      flash[:notice] = '入力されたメールアドレスは登録されていません'
      redirect_to({:controller=>'login', :action=>'signup'})
    end
  end

  def sentpassword
  end

  ###########################################################
  # メソッド：deleteアクション
  # 概　　要：ユーザー削除用アクション
  ###########################################################
  def delete
    if params['id'] and session['user']
      @user = MstUser.find(params['id'])
      @user.destroy
    end
    redirect_back_or_default :controller => "dashboard", :action => "index"
  end  

  #
  #ログアウトを行う
  #
  #セッションデータ中のユーザデータを削除して，ログイン画面へリダイレクト．
  #
  def logout
    session['user'] = nil
    redirect_back_or_default(:controller => 'login', :action => 'login')
  end


:protected

    
  #
  #ランダムなパスワードを生成する
  #
  def create_password
    base = "0123456789abcdefghijklmnopqrstuvwxyz"
    retpass = ""
    for i in 1..10
      retpass += base[rand(base.length), 1]
    end

    return retpass
  end


  # move to the last store_location call or to the passed default one
  def redirect_back_or_default(default)
    if session['return-to'].nil?
      redirect_to default
    else
      redirect_to session['return-to']
      session['return-to'] = nil
    end
  end
end
